package com.example.jwt.utils;


import cn.hutool.core.convert.Convert;
import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTPayload;
import com.example.jwt.entity.TokenUser;
import lombok.extern.slf4j.Slf4j;

import java.util.HashMap;
import java.util.Map;
import cn.hutool.jwt.JWTUtil;
import org.springframework.beans.factory.annotation.Value;

/**
 * @author: mtl
 * jwt工具，用来生成、校验token以及提取token中的信息
 */
@Slf4j
public class MyJwtUtil {


    private static String jwtKey="123";

    @Value("${jwt.header}")
    public static void setJwtKey(String key) {
        jwtKey = key;
    }

    /**
     * 指定一个token过期时间（毫秒） //7天
     */
    private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000;
    private static final String TOKEN  = "token";

    /**
     * 生成token
     */
    /**
     * 注意这里的sercet不是密码，而是进行三件套（salt+MD5+1024Hash）处理密码后得到的凭证 //使用密钥进行哈希
     * 这里为什么要这么做，在controller中进行说明
     * @return
     */

    public static String getJwtToken(TokenUser loginUser) {
        long date = System.currentTimeMillis();
        Map<String,Object> payload = new HashMap<String,Object>();
        //签发时间
        payload.put(JWTPayload.ISSUED_AT, date);
        //过期时间
        payload.put(JWTPayload.EXPIRES_AT, date + EXPIRE_TIME);
        //生效时间
        payload.put(JWTPayload.NOT_BEFORE, date);
        //载荷
        payload.put("username", loginUser.getUsername());
        payload.put("salt", loginUser.getSalt());
        String token = JWTUtil.createToken(payload, jwtKey.getBytes());
        return token;
    }

    /**
     * 校验token是否正确
     */
    public static boolean verifyToken(String token) {
        try {
            boolean verifyKey = JWTUtil.verify(token, jwtKey.getBytes());
            log.error("token 解析错误{} ",verifyKey);
            if (verifyKey){
                return true;
            }else{
                return false;
            }
        } catch (Exception exception) {
            return false;
        }
    }

    /**
     * 在token中获取到username信息
     */
    public static String getUsername(String token) {
        try {
            JWT jwt = JWTUtil.parseToken(token);
            return (String) jwt.getPayload("username");
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 判断是否过期
     */
    public static boolean isExpire(String token){
        JWT jwt = JWTUtil.parseToken(token);
        Object payload = jwt.getPayload(JWTPayload.EXPIRES_AT);
        long jwtDate = Convert.toLong(payload);
        long thisDate = System.currentTimeMillis();
        return jwtDate<thisDate;
    }

    public static void main(String[] args) {
        String jwt = getJwtToken(new TokenUser().setUsername("admin").setPassword("admin"));
        System.out.println(jwt);
    }
}
